package com.atguigu.boot2.conf;

import ch.qos.logback.core.db.DBHelper;
import com.atguigu.boot2.bean.Car;
import com.atguigu.boot2.bean.Pet;
import com.atguigu.boot2.bean.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;
import org.springframework.web.filter.CharacterEncodingFilter;

/**
 * @author 杨林
 * @create 2023-08-21 10:49 星期一
 * description:
 */

/**
 * 1、配置类使用@Bean标注在方法上，给容器注册主键，默认也是单实例的
 * 2、配置类本身也是一个组件
 * 3、proxyBeanMethods：代理bean的方法
 *      Full(proxyBeanMethods = true)
 *      Lite(proxyBeanMethods = false)
 *      解决组件依赖场景
 *      
 * @Import
 *  给容器中自动创建初这两个类型的组件，默认组件的名字就是全类名
 *  
 * @EnableConfigurationProperties(Car.class)
 *  1、开启Car的配置绑定功能
 *  2、把Car这个组件自动注册到容器中
 */
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = false)  //告诉SpringBoot这是一个配置类  == 配置文件
@ImportResource("classpath:beans.xml")   //导入Spring的配置文件，使文件生效
@EnableConfigurationProperties(Car.class)   //开启属性配置功能
public class MyConfig {


    /**
     * 外部无论对配置类中组件注册方法调用多少次获取到的都是之前注册容器中的单实例对象
     * @return
     */
    @Bean   //给容易中添加组件   以方法名作为组件的id  返回类型就是组件类型  方法返回的值就是组件在容器中保存的实例
    //@ConditionalOnBean(name = "tom")  //条件装配：当容器中有tom组件时，才会将user01放入到容器中
    //@ConditionalOnMissingBean(name = "tom")  //条件装配，当容器中没有tom组件时，才会将user01放入到容器中
    public User user01(){
        User zhangsan = new User("张三", 18);
        //user组件依赖了pet组件
        //如果@Configuration(proxyBeanMethods = true)  依赖是成了的
        //如果@Configuration(proxyBeanMethods = true) 依赖不成立，
//        zhangsan.setPer(tomcat());
        return zhangsan;   
    }
    
    @Bean("tom")   //自定义组件名
    public Pet tomcat(){
        return new Pet(18,"猫粮");
    }
    
//    @Bean
//    public CharacterEncodingFilter characterEncodingFilter(){
//        return new CharacterEncodingFilter();
//    }
    
}
